<!DOCTYPE html>



  


<html class="theme-next gemini use-motion" lang="zh-CN">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"/>
<meta name="theme-color" content="#222">












<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />






















<link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=6.0.6" rel="stylesheet" type="text/css" />


  <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=6.0.6">


  <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=6.0.6">


  <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=6.0.6">


  <link rel="mask-icon" href="/images/logo.svg?v=6.0.6" color="#222">









<script type="text/javascript" id="hexo.configurations">
  var NexT = window.NexT || {};
  var CONFIG = {
    root: '/',
    scheme: 'Gemini',
    version: '6.0.6',
    sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false},
    fancybox: false,
    fastclick: false,
    lazyload: false,
    tabs: true,
    motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}},
    algolia: {
      applicationID: '',
      apiKey: '',
      indexName: '',
      hits: {"per_page":10},
      labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}
    }
  };
</script>


  




  

<meta name="description" content="事务四大特性 1. 原子性 2. 一致性 3. 隔离性 4. 持久性   数据不一致 1. 丢失修改 2. 读脏数据 3. 不可重复读   隔离级别 1. 未提交读（READ UNCOMMITTED） 2. 提交读（READ COMMITTED） 3. 可重复读（REPEATABLE READ） 4. 可串行化（SERIALIXABLE）   可串行化调度 封锁类型 封锁粒度 封锁协议 三级封">
<meta name="keywords" content="数据库">
<meta property="og:type" content="article">
<meta property="og:title" content="数据库系统原理（转）">
<meta property="og:url" content="http://7ht.gitee.io/2018/03/16/数据库系统原理（转）/index.html">
<meta property="og:site_name" content="HonTu&#39;s Notes">
<meta property="og:description" content="事务四大特性 1. 原子性 2. 一致性 3. 隔离性 4. 持久性   数据不一致 1. 丢失修改 2. 读脏数据 3. 不可重复读   隔离级别 1. 未提交读（READ UNCOMMITTED） 2. 提交读（READ COMMITTED） 3. 可重复读（REPEATABLE READ） 4. 可串行化（SERIALIXABLE）   可串行化调度 封锁类型 封锁粒度 封锁协议 三级封">
<meta property="og:locale" content="zh-CN">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?S(Sno,Cname,Sname,Sdept,Mname)">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?Sno,Cname->Sname,Sdept,Mname">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?S1(Sno,Sname,Sdept,Mname)">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?Sno->Sname,Sdept,Mname">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?Sdept->Mname">
<meta property="og:image" content="http://7ht.gitee.io/2018/03/16/pics//8ef22836-8800-4765-b4b8-ade80096b323.jpg">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?S2(Sno,Cname,Grade)">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?Sno,Cname->Grade">
<meta property="og:image" content="http://7ht.gitee.io/2018/03/16/pics//b0748916-1acd-4138-b24c-69326cb452fe.jpg">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?Sname,Cname->Tname">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?Sname,Cname->Grade">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?Sname,Tname->Cname">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?Sname,Tname->Grade">
<meta property="og:image" content="https://latex.codecogs.com/gif.latex?Tname->Cname">
<meta property="og:updated_time" content="2018-03-28T03:27:24.962Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="数据库系统原理（转）">
<meta name="twitter:description" content="事务四大特性 1. 原子性 2. 一致性 3. 隔离性 4. 持久性   数据不一致 1. 丢失修改 2. 读脏数据 3. 不可重复读   隔离级别 1. 未提交读（READ UNCOMMITTED） 2. 提交读（READ COMMITTED） 3. 可重复读（REPEATABLE READ） 4. 可串行化（SERIALIXABLE）   可串行化调度 封锁类型 封锁粒度 封锁协议 三级封">
<meta name="twitter:image" content="https://latex.codecogs.com/gif.latex?S(Sno,Cname,Sname,Sdept,Mname)">






  <link rel="canonical" href="http://7ht.gitee.io/2018/03/16/数据库系统原理（转）/"/>



<script type="text/javascript" id="page.configurations">
  CONFIG.page = {
    sidebar: "",
  };
</script>

  <title>数据库系统原理（转） | HonTu's Notes</title>
  









  <noscript>
  <style type="text/css">
    .use-motion .motion-element,
    .use-motion .brand,
    .use-motion .menu-item,
    .sidebar-inner,
    .use-motion .post-block,
    .use-motion .pagination,
    .use-motion .comments,
    .use-motion .post-header,
    .use-motion .post-body,
    .use-motion .collection-title { opacity: initial; }

    .use-motion .logo,
    .use-motion .site-title,
    .use-motion .site-subtitle {
      opacity: initial;
      top: initial;
    }

    .use-motion {
      .logo-line-before i { left: initial; }
      .logo-line-after i { right: initial; }
    }
  </style>
</noscript>

</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN">

  
  
    
  

  <div class="container sidebar-position-left page-post-detail">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"> 

<div class="site-brand-wrapper">
  <div class="site-meta ">
    

    <div class="custom-logo-site-title">
      <a href="/" class="brand" rel="start">
        <span class="logo-line-before"><i></i></span>
        <span class="site-title">HonTu's Notes</span>
        <span class="logo-line-after"><i></i></span>
      </a>
    </div>
      
        <p class="site-subtitle">一小瓶</p>
      
  </div>

  <div class="site-nav-toggle">
    <button aria-label="切换导航栏">
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
      <span class="btn-bar"></span>
    </button>
  </div>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu">
      
        
        
          
  <li class="menu-item menu-item-home">
    <a href="/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-home"></i> <br />首页</a>
</li>

      
        
        
          
  <li class="menu-item menu-item-about">
    <a href="/about/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-user"></i> <br />关于</a>
</li>

      
        
        
          
  <li class="menu-item menu-item-tags">
    <a href="/tags/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-tags"></i> <br />标签</a>
</li>

      
        
        
          
  <li class="menu-item menu-item-categories">
    <a href="/categories/" rel="section">
      <i class="menu-item-icon fa fa-fw fa-th"></i> <br />分类</a>
</li>

      

      
    </ul>
  

  

  
</nav>


  



 </div>
    </header>

    


    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          
            

          
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  

  
  
  

  

  <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article">
  
  
  
  <div class="post-block">
    <link itemprop="mainEntityOfPage" href="http://7ht.gitee.io/2018/03/16/数据库系统原理（转）/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="name" content="Q.hongtao">
      <meta itemprop="description" content="">
      <meta itemprop="image" content="/images/head_cat.jpg">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="HonTu's Notes">
    </span>

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">数据库系统原理（转）</h1>
        

        <div class="post-meta">
          <span class="post-time">
            
              <span class="post-meta-item-icon">
                <i class="fa fa-calendar-o"></i>
              </span>
              
                <span class="post-meta-item-text">发表于</span>
              
              <time title="创建于" itemprop="dateCreated datePublished" datetime="2018-03-16T18:49:49+08:00">2018-03-16</time>
            

            
            

            
          </span>

          
            <span class="post-category" >
            
              <span class="post-meta-divider">|</span>
            
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              
                <span class="post-meta-item-text">分类于</span>
              
              
                <span itemprop="about" itemscope itemtype="http://schema.org/Thing"><a href="/categories/基础知识/" itemprop="url" rel="index"><span itemprop="name">基础知识</span></a></span>

                
                
              
            </span>
          

          
            
          

          
          

          
            <span class="post-meta-divider">|</span>
            <span class="post-meta-item-icon"
            >
            <i class="fa fa-eye"></i>
             阅读次数： 
            <span class="busuanzi-value" id="busuanzi_value_page_pv" ></span>
            </span>
          

          

          

        </div>
      </header>
    

    
    
    
    <div class="post-body" itemprop="articleBody">

      
      

      
        <!-- GFM-TOC -->
<ul>
<li><a href="#事务四大特性">事务四大特性</a><ul>
<li><a href="#1-原子性">1. 原子性</a></li>
<li><a href="#2-一致性">2. 一致性</a></li>
<li><a href="#3-隔离性">3. 隔离性</a></li>
<li><a href="#4-持久性">4. 持久性</a></li>
</ul>
</li>
<li><a href="#数据不一致">数据不一致</a><ul>
<li><a href="#1-丢失修改">1. 丢失修改</a></li>
<li><a href="#2-读脏数据">2. 读脏数据</a></li>
<li><a href="#3-不可重复读">3. 不可重复读</a></li>
</ul>
</li>
<li><a href="#隔离级别">隔离级别</a><ul>
<li><a href="#1-未提交读read-uncommitted">1. 未提交读（READ UNCOMMITTED）</a></li>
<li><a href="#2-提交读read-committed">2. 提交读（READ COMMITTED）</a></li>
<li><a href="#3-可重复读repeatable-read">3. 可重复读（REPEATABLE READ）</a></li>
<li><a href="#4-可串行化serialixable">4. 可串行化（SERIALIXABLE）</a></li>
</ul>
</li>
<li><a href="#可串行化调度">可串行化调度</a></li>
<li><a href="#封锁类型">封锁类型</a></li>
<li><a href="#封锁粒度">封锁粒度</a></li>
<li><a href="#封锁协议">封锁协议</a><ul>
<li><a href="#三级封锁协议">三级封锁协议</a></li>
<li><a href="#两段锁协议">两段锁协议</a></li>
</ul>
</li>
<li><a href="#乐观锁和悲观锁">乐观锁和悲观锁</a><ul>
<li><a href="#悲观锁">悲观锁</a></li>
<li><a href="#乐观锁">乐观锁</a></li>
<li><a href="#mysql-隐式和显示锁定">MySQL 隐式和显示锁定</a></li>
</ul>
</li>
<li><a href="#范式">范式</a><ul>
<li><a href="#第一范式-1nf">第一范式 (1NF)</a></li>
<li><a href="#第二范式-2nf">第二范式 (2NF)</a></li>
<li><a href="#第三范式-3nf">第三范式 (3NF)</a></li>
<li><a href="#bc-范式bcnf">BC 范式（BCNF）</a></li>
</ul>
</li>
<li><a href="#约束">约束</a><ul>
<li><a href="#键码">键码</a></li>
<li><a href="#单值约束">单值约束</a></li>
<li><a href="#引用完整性约束">引用完整性约束</a></li>
<li><a href="#域约束">域约束</a></li>
<li><a href="#一般约束">一般约束</a></li>
</ul>
</li>
<li><a href="#数据库的三层模式和两层映像">数据库的三层模式和两层映像</a><ul>
<li><a href="#外模式">外模式</a></li>
<li><a href="#模式">模式</a></li>
<li><a href="#内模式">内模式</a></li>
<li><a href="#外模式模式映像">外模式/模式映像</a></li>
<li><a href="#模式内模式映像">模式/内模式映像</a></li>
</ul>
</li>
<li><a href="#er-图">ER 图</a><ul>
<li><a href="#实体的三种联系">实体的三种联系</a></li>
<li><a href="#表示出现多次的关系">表示出现多次的关系</a></li>
<li><a href="#联系的多向性">联系的多向性</a></li>
<li><a href="#表示子类">表示子类</a></li>
</ul>
</li>
<li><a href="#一些概念">一些概念</a></li>
<li><a href="#参考资料">参考资料</a><!-- GFM-TOC -->
</li>
</ul>
<h1 id="事务四大特性"><a href="#事务四大特性" class="headerlink" title="事务四大特性"></a>事务四大特性</h1><h2 id="1-原子性"><a href="#1-原子性" class="headerlink" title="1. 原子性"></a>1. 原子性</h2><p>事务被视为不可分割的最小单元，要么全部提交成功，要么全部失败回滚。</p>
<h2 id="2-一致性"><a href="#2-一致性" class="headerlink" title="2. 一致性"></a>2. 一致性</h2><p>事务执行前后都保持一致性状态。在一致性状态下，所有事务对一个数据的读取结果都是相同的。</p>
<h2 id="3-隔离性"><a href="#3-隔离性" class="headerlink" title="3. 隔离性"></a>3. 隔离性</h2><p>一个事务所做的修改在最终提交以前，对其它事务是不可见的。也可以理解为多个事务单独执行，互不影响。</p>
<h2 id="4-持久性"><a href="#4-持久性" class="headerlink" title="4. 持久性"></a>4. 持久性</h2><p>一旦事务提交，则其所做的修改将会永远保存到数据库中。即使系统发生崩溃，事务执行的结果也不能丢失。持久性通过数据库备份和恢复来保证。</p>
<h1 id="数据不一致"><a href="#数据不一致" class="headerlink" title="数据不一致"></a>数据不一致</h1><h2 id="1-丢失修改"><a href="#1-丢失修改" class="headerlink" title="1. 丢失修改"></a>1. 丢失修改</h2><p>T<sub>1</sub> 和 T<sub>2</sub> 两个事务同时对一个数据进行修改，T<sub>1</sub> 先修改，T<sub>2</sub> 随后修改，T<sub>2</sub> 的修改覆盖了 T<sub>1</sub> 的修改。</p>
<h2 id="2-读脏数据"><a href="#2-读脏数据" class="headerlink" title="2. 读脏数据"></a>2. 读脏数据</h2><p>T<sub>1</sub> 修改后写入数据库，T<sub>2</sub> 读取这个修改后的数据，但是如果 T<sub>1</sub> 撤销了这次修改，使得 T<sub>2</sub> 读取的数据是脏数据。</p>
<h2 id="3-不可重复读"><a href="#3-不可重复读" class="headerlink" title="3. 不可重复读"></a>3. 不可重复读</h2><p>T<sub>1</sub> 读入某个数据，T<sub>2</sub> 对该数据做了修改，如果 T<sub>1</sub> 再读这个数据，该数据已经改变，和最开始读入的是不一样的。</p>
<h1 id="隔离级别"><a href="#隔离级别" class="headerlink" title="隔离级别"></a>隔离级别</h1><p>数据库管理系统需要防止出现数据不一致问题，并且有多种级别可以实现，这些级别称为隔离级别。</p>
<h2 id="1-未提交读（READ-UNCOMMITTED）"><a href="#1-未提交读（READ-UNCOMMITTED）" class="headerlink" title="1. 未提交读（READ UNCOMMITTED）"></a>1. 未提交读（READ UNCOMMITTED）</h2><p>事务中的修改，即使没有提交，对其它事务也都是可见的。事务可以读取未提交的数据，这也被称为脏读。</p>
<h2 id="2-提交读（READ-COMMITTED）"><a href="#2-提交读（READ-COMMITTED）" class="headerlink" title="2. 提交读（READ COMMITTED）"></a>2. 提交读（READ COMMITTED）</h2><p>一个事务只能读取已经提交的事务所做的修改。换句话说，一个事务所在的修改在提交之前对其它事务是不可见的。这个级别有时候也叫做不可重复读，因为两次执行同样的查询，可能会得到不一样的结果。</p>
<h2 id="3-可重复读（REPEATABLE-READ）"><a href="#3-可重复读（REPEATABLE-READ）" class="headerlink" title="3. 可重复读（REPEATABLE READ）"></a>3. 可重复读（REPEATABLE READ）</h2><p>解决了脏读的问题，保证在同一个事务中多次读取同样的记录结果是一致的。</p>
<p>但是会出现幻读的问题，所谓幻读，指的是某个事务在读取某个范围内的记录时，另一个事务会在范围内插入数据，当之前的事务再次读取该范围的记录时，会产生幻行。</p>
<h2 id="4-可串行化（SERIALIXABLE）"><a href="#4-可串行化（SERIALIXABLE）" class="headerlink" title="4. 可串行化（SERIALIXABLE）"></a>4. 可串行化（SERIALIXABLE）</h2><p>强制事务串行执行，避免幻读。</p>
<h1 id="可串行化调度"><a href="#可串行化调度" class="headerlink" title="可串行化调度"></a>可串行化调度</h1><p>如果并行的事务的执行结果和某一个串行的方式执行的结果一样，那么可以认为结果是正确的。</p>
<h1 id="封锁类型"><a href="#封锁类型" class="headerlink" title="封锁类型"></a>封锁类型</h1><p>排它锁 (X 锁）和共享锁 (S 锁），又称写锁和读锁。</p>
<ul>
<li><p>一个事务对数据对象 A 加了 X 锁，就可以对 A 进行读取和更新。加锁期间其它事务不能对 A 加任何锁；</p>
</li>
<li><p>一个事务对数据对象 A 加了 S 锁，可以对 A 进行读取操作，但是不能进行更新操作。加锁期间其它事务能对 A 加 S 锁，但是不能加 X 锁。</p>
</li>
</ul>
<h1 id="封锁粒度"><a href="#封锁粒度" class="headerlink" title="封锁粒度"></a>封锁粒度</h1><p>应该尽量只锁定需要修改的那部分数据，而不是所有的资源。锁定的数据量越少，发生锁争用的可能就越小，系统的并发程度就越高。</p>
<p>但是加锁需要消耗资源，锁的各种操作，包括获取锁，检查所是否已经解除、释放锁，都会增加系统开销。因此封锁粒度越小，系统开销就越大。需要在锁开销以及数据安全性之间做一个权衡。</p>
<p>MySQL 中主要提供了两种封锁粒度：行级锁以及表级锁。</p>
<h1 id="封锁协议"><a href="#封锁协议" class="headerlink" title="封锁协议"></a>封锁协议</h1><h2 id="三级封锁协议"><a href="#三级封锁协议" class="headerlink" title="三级封锁协议"></a>三级封锁协议</h2><p><strong>一级封锁协议</strong></p>
<p>事务 T 要修改数据 A 时必须加 X 锁，直到事务结束才释放锁。</p>
<p>可以解决丢失修改问题；</p>
<p><strong>二级封锁协议</strong></p>
<p>在一级的基础上，要求读取数据 A 时必须加 S 锁，读取完马上释放 S 锁。</p>
<p>可以解决读脏数据问题，因为如果一个事务在对数据 A 进行修改，根据 1 级封锁协议，会加 X 锁，那么就不能再加 S 锁了，也就是不会读入数据。</p>
<p><strong>三级封锁协议</strong></p>
<p>在二级的基础上，要求读取数据 A 时必须加 S 锁，直到事务结束了才能释放 S 锁。</p>
<p>可以解决不可重复读的问题，因为读 A 时，其它事务不能对 A 加 X 锁，从而避免了在读的期间数据发生改变。</p>
<h2 id="两段锁协议"><a href="#两段锁协议" class="headerlink" title="两段锁协议"></a>两段锁协议</h2><p>加锁和解锁分为两个阶段进行。两段锁是并行事务可串行化的充分条件，但不是必要条件。</p>
<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lock-x(A)...lock-s(B)...lock-s(c)...unlock(A)...unlock(C)...unlock(B)</span><br></pre></td></tr></table></figure>
<h1 id="乐观锁和悲观锁"><a href="#乐观锁和悲观锁" class="headerlink" title="乐观锁和悲观锁"></a>乐观锁和悲观锁</h1><h2 id="悲观锁"><a href="#悲观锁" class="headerlink" title="悲观锁"></a>悲观锁</h2><p>假定会发生并发冲突，屏蔽一切可能违反数据完整性的操作。</p>
<p>Java synchronized 就属于悲观锁的一种实现，每次线程要修改数据时都先获得锁，保证同一时刻只有一个线程能操作数据，其他线程则会被阻塞。</p>
<h2 id="乐观锁"><a href="#乐观锁" class="headerlink" title="乐观锁"></a>乐观锁</h2><p>假设不会发生并发冲突，只在提交操作时检查是否违反数据完整性。</p>
<p>Java JUC 中的 Atomic 包就是乐观锁的一种实现，AtomicInteger 通过 CAS（Compare And Set）操作实现线程安全的自增操作。</p>
<p>乐观锁有两种实现方式，数据版本和时间戳。它们都需要在数据库表中增加一个字段，使用这个字段来判断数据是否过期。例如，数据版本实现方式中，需要在数据库表中增加一个数字类型的 version 字段，当读取数据时，将 version 字段的值一同读出。随后数据每更新一次，对此 version 值加 1。当提交更新的时候，判断读出的 version 和数据库表中的 version 是否一致，如果一致，则予以更新；否则认为是过期数据。</p>
<h2 id="MySQL-隐式和显示锁定"><a href="#MySQL-隐式和显示锁定" class="headerlink" title="MySQL 隐式和显示锁定"></a>MySQL 隐式和显示锁定</h2><p>MySQL InnoDB 采用的是两阶段锁协议。在事务执行过程中，随时都可以执行锁定，锁只有在执行 COMMIT 或者 ROLLBACK 的时候才会释放，并且所有的锁是在同一时刻被释放。前面描述的锁定都是隐式锁定，InnoDB 会根据事务隔离级别在需要的时候自动加锁。</p>
<p>另外，InnoDB 也支持通过特定的语句进行显示锁定，这些语句不属于 SQL 规范：</p>
<ul>
<li>SELECT … LOCK IN SHARE MODE</li>
<li>SELECT … FOR UPDATE</li>
</ul>
<h1 id="范式"><a href="#范式" class="headerlink" title="范式"></a>范式</h1><p>记 A-&gt;B 表示 A 函数决定 B，也可以说 B 函数依赖于 A。</p>
<p>如果 {A1，A2，… ，An} 是关系的一个或多个属性的集合，该集合决定了关系的其它所有属性并且是最小的，那么该集合就称为键码。</p>
<p>对于 W-&gt;A，如果能找到 W 的真子集 W’，使得 W’-&gt; A，那么 W-&gt;A 就是部分函数依赖，否则就是完全函数依赖；</p>
<p>以下关系中，Sno 表示学号，Sname 表示学生姓名，Sdept 表示学院，Cname 表示课程名，Mname 表示院长姓名。函数依赖为 {Sno, Cname} -&gt; {Sname, Sdept, Mname}。</p>
<p>不符合范式的关系，会产生很多异常。主要有以下四种异常：</p>
<ol>
<li>冗余数据</li>
<li>修改异常</li>
<li>删除异常</li>
<li>插入异常，比如如果新插入一个学生的信息，而这个学生还没选课，那么就无法插入该学生。</li>
</ol>
<p>关系数据库的范式理论就是是为了解决这四种异常。</p>
<p>高级别范式的依赖基于低级别的范式。</p>
<h2 id="第一范式-1NF"><a href="#第一范式-1NF" class="headerlink" title="第一范式 (1NF)"></a>第一范式 (1NF)</h2><p>属性不可分。</p>
<h2 id="第二范式-2NF"><a href="#第二范式-2NF" class="headerlink" title="第二范式 (2NF)"></a>第二范式 (2NF)</h2><p>每个非主属性完全函数依赖于键码。</p>
<p>可以通过分解来满足。</p>
<p><strong>分解前</strong></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?S(Sno,Cname,Sname,Sdept,Mname)"></div> <br></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?Sno,Cname->Sname,Sdept,Mname"></div> <br></p>
<p><strong>分解后</strong></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?S1(Sno,Sname,Sdept,Mname)"></div> <br></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?Sno->Sname,Sdept,Mname"></div> <br></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?Sdept->Mname"></div> <br></p>
<p><div align="center"> <img src="../pics//8ef22836-8800-4765-b4b8-ade80096b323.jpg"> </div><br></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?S2(Sno,Cname,Grade)"></div> <br></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?Sno,Cname->Grade"></div> <br></p>
<p><div align="center"> <img src="../pics//b0748916-1acd-4138-b24c-69326cb452fe.jpg"> </div><br></p>
<h2 id="第三范式-3NF"><a href="#第三范式-3NF" class="headerlink" title="第三范式 (3NF)"></a>第三范式 (3NF)</h2><p>非主属性不传递依赖于键码。</p>
<p>上述 S1 存在传递依赖，Mname 依赖于 Sdept，而 Sdept 又依赖于 Sno，可以继续分解。</p>
<h2 id="BC-范式（BCNF）"><a href="#BC-范式（BCNF）" class="headerlink" title="BC 范式（BCNF）"></a>BC 范式（BCNF）</h2><p>所有属性不传递依赖于键码。</p>
<p>关系模式 STC(Sname, Tname, Cname, Grade)，其中四个属性分别为学生姓名、教师姓名、课程名和成绩。有以下函数依赖：</p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?Sname,Cname->Tname"></div> <br></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?Sname,Cname->Grade"></div> <br></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?Sname,Tname->Cname"></div> <br></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?Sname,Tname->Grade"></div> <br></p>
<p><div align="center"><img src="https://latex.codecogs.com/gif.latex?Tname->Cname"></div> <br></p>
<p>分解成 SC(Sname, Cname, Grade) 和 ST(Sname, Tname)，对于 ST，属性之间是多对多关系，无函数依赖。</p>
<h1 id="约束"><a href="#约束" class="headerlink" title="约束"></a>约束</h1><h2 id="键码"><a href="#键码" class="headerlink" title="键码"></a>键码</h2><p>用于唯一表示一个实体。</p>
<p>键码可以由多个属性构成，每个构成键码的属性称为码。</p>
<h2 id="单值约束"><a href="#单值约束" class="headerlink" title="单值约束"></a>单值约束</h2><p>某个属性的值是唯一的。</p>
<h2 id="引用完整性约束"><a href="#引用完整性约束" class="headerlink" title="引用完整性约束"></a>引用完整性约束</h2><p>一个实体的属性引用的值在另一个实体的某个属性中存在。</p>
<h2 id="域约束"><a href="#域约束" class="headerlink" title="域约束"></a>域约束</h2><p>某个属性的值在特定范围之内。</p>
<h2 id="一般约束"><a href="#一般约束" class="headerlink" title="一般约束"></a>一般约束</h2><p>一般性约束，比如大小约束，数量约束。</p>
<h1 id="数据库的三层模式和两层映像"><a href="#数据库的三层模式和两层映像" class="headerlink" title="数据库的三层模式和两层映像"></a>数据库的三层模式和两层映像</h1><ul>
<li>外模式：局部逻辑结构</li>
<li>模式：全局逻辑结构</li>
<li>内模式：物理结构</li>
</ul>
<h2 id="外模式"><a href="#外模式" class="headerlink" title="外模式"></a>外模式</h2><p>又称用户模式，是用户和数据库系统的接口，特定的用户只能访问数据库系统提供给他的外模式中的数据。例如不同的用户创建了不同数据库，那么一个用户只能访问他有权限访问的数据库。</p>
<p>一个数据库可以有多个外模式，一个用户只能有一个外模式，但是一个外模式可以给多个用户使用。</p>
<h2 id="模式"><a href="#模式" class="headerlink" title="模式"></a>模式</h2><p>可以分为概念模式和逻辑模式，概念模式可以用概念-关系来描述；逻辑模式使用特定的数据模式（比如关系模型）来描述数据的逻辑结构，这种逻辑结构包括数据的组成、数据项的名称、类型、取值范围。不仅如此，逻辑模式还要描述数据之间的关系，数据的完整性与安全性要求。</p>
<h2 id="内模式"><a href="#内模式" class="headerlink" title="内模式"></a>内模式</h2><p>又称为存储模式，描述记录的存储方式，例如索引的组织方式、数据是否压缩以及是否加密等等。</p>
<h2 id="外模式-模式映像"><a href="#外模式-模式映像" class="headerlink" title="外模式/模式映像"></a>外模式/模式映像</h2><p>把外模式的局部逻辑结构和模式的全局逻辑结构联系起来。该映像可以保证数据和应用程序的逻辑独立性。</p>
<h2 id="模式-内模式映像"><a href="#模式-内模式映像" class="headerlink" title="模式/内模式映像"></a>模式/内模式映像</h2><p>把模式的全局逻辑结构和内模式的物理结构联系起来，该映像可以保证数据和应用程序的物理独立性。</p>
<h1 id="ER-图"><a href="#ER-图" class="headerlink" title="ER 图"></a>ER 图</h1><p>Entity-Relationship，有三个组成部分：实体、属性、联系。</p>
<h2 id="实体的三种联系"><a href="#实体的三种联系" class="headerlink" title="实体的三种联系"></a>实体的三种联系</h2><p>联系包含 1 对 1，1 对多，多对多三种。</p>
<p>如果 A 到 B 是 1 对多关系，那么画个带箭头的线段指向 B；如果是 1 对 1，画两个带箭头的线段；如果是多对多，画两个不带箭头的线段。下图的 Course 和 Student 是 1 对多的关系。</p>
<h2 id="表示出现多次的关系"><a href="#表示出现多次的关系" class="headerlink" title="表示出现多次的关系"></a>表示出现多次的关系</h2><p>一个实体在联系出现几次，就要用几条线连接。下图表示一个课程的先修关系，先修关系出现两个 Course 实体，第一个是先修课程，后一个是后修课程，因此需要用两条线来表示这种关系。</p>
<h2 id="联系的多向性"><a href="#联系的多向性" class="headerlink" title="联系的多向性"></a>联系的多向性</h2><p>虽然老师可以开设多门课，并且可以教授多名学生，但是对于特定的学生和课程，只有一个老师教授，这就构成了一个三元联系。</p>
<p>一般只使用二元联系，可以把多元关系转换为二元关系。</p>
<h2 id="表示子类"><a href="#表示子类" class="headerlink" title="表示子类"></a>表示子类</h2><p>用 IS-A 联系来表示子类，具体做法是用一个三角形和两条线来连接类和子类。与子类有关的属性和联系都连到子类上，而与父类和子类都有关的连到父类上。</p>
<h1 id="一些概念"><a href="#一些概念" class="headerlink" title="一些概念"></a>一些概念</h1><p><strong>数据模型</strong></p>
<p>由数据结构、数据操作和完整性三个要素组成。</p>
<p><strong>数据库系统</strong></p>
<p>数据库系统包含所有与数据库相关的内容，包括数据库、数据库管理系统、应用程序以及数据库管理员和用户，还包括相关的硬件和软件。</p>
<h1 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h1><ul>
<li>史嘉权. 数据库系统概论[M]. 清华大学出版社有限公司, 2006.</li>
<li>施瓦茨. 高性能MYSQL(第3版)[M]. 电子工业出版社, 2013.</li>
<li><a href="https://www.jianshu.com/p/f5ff017db62a" target="_blank" rel="noopener">MySQL 乐观锁与悲观锁 </a></li>
<li>转载自<a href="https://github.com/CyC2018" target="_blank" rel="noopener">https://github.com/CyC2018</a></li>
</ul>

      
    </div>

    

    
    
    

    <div>
          
            
<div class="my_post_copyright">
  <script src="//cdn.bootcss.com/clipboard.js/1.5.10/clipboard.min.js"></script>

  <!-- JS库 sweetalert 可修改路径 -->
  <script src="https://cdn.bootcss.com/jquery/2.0.0/jquery.min.js"></script>
  <script src="https://unpkg.com/sweetalert/dist/sweetalert.min.js"></script>
  <p><span>本文标题:</span><a href="/2018/03/16/数据库系统原理（转）/">数据库系统原理（转）</a></p>
  <p><span>文章作者:</span><a href="/" title="访问 Q.hongtao 的个人博客">Q.hongtao</a></p>
  <p><span>发布时间:</span>2018年03月16日 - 18:03</p>
  <p><span>最后更新:</span>2018年03月28日 - 11:03</p>
  <p><span>原始链接:</span><a href="/2018/03/16/数据库系统原理（转）/" title="数据库系统原理（转）">http://7ht.gitee.io/2018/03/16/数据库系统原理（转）/</a>
    <span class="copy-path"  title="点击复制文章链接"><i class="fa fa-clipboard" data-clipboard-text="http://7ht.gitee.io/2018/03/16/数据库系统原理（转）/"  aria-label="复制成功！"></i></span>
  </p>
  <p><span>许可协议:</span><i class="fa fa-creative-commons"></i> <a rel="license" href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank" title="Attribution-NonCommercial-NoDerivatives 4.0 International (CC BY-NC-ND 4.0)">署名-非商业性使用-禁止演绎 4.0 国际</a> 转载请保留原文链接及作者。</p>
</div>
<script>
    var clipboard = new Clipboard('.fa-clipboard');
      $(".fa-clipboard").click(function(){
      clipboard.on('success', function(){
        swal({
          title: "",
          text: '复制成功',
          icon: "success",
          showConfirmButton: true
          });
        });
    });
</script>


          
      </div>

    

    

    
  <div>
  
    

  
</div>
    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/数据库/" rel="tag"># 数据库</a>
          
        </div>
      

      
      
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/2018/03/16/计算机操作系统（转）/" rel="next" title="计算机操作系统（转）">
                <i class="fa fa-chevron-left"></i> 计算机操作系统（转）
              </a>
            
          </div>

          <span class="post-nav-divider"></span>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/2018/03/16/分布式基础（转）/" rel="prev" title="分布式基础（转）">
                分布式基础（转） <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </div>
  
  
  
  </article>



    <div class="post-spread">
      
    </div>
  </div>


          </div>
          

  



        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap">
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview-wrap">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview-wrap sidebar-panel">
        <div class="site-overview">
          <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
            
              <img class="site-author-image" itemprop="image"
                src="/images/head_cat.jpg"
                alt="Q.hongtao" />
            
              <p class="site-author-name" itemprop="name">Q.hongtao</p>
              <p class="site-description motion-element" itemprop="description">没有可怕的深度 就没有美丽的水面</p>
          </div>

          
            <nav class="site-state motion-element">
              
                <div class="site-state-item site-state-posts">
                
                  <a href="/archives">
                
                    <span class="site-state-item-count">34</span>
                    <span class="site-state-item-name">日志</span>
                  </a>
                </div>
              

              
                
                
                <div class="site-state-item site-state-categories">
                  <a href="/categories/index.html">
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">9</span>
                    <span class="site-state-item-name">分类</span>
                  </a>
                </div>
              

              
                
                
                <div class="site-state-item site-state-tags">
                  <a href="/tags/index.html">
                    
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                      
                    
                    <span class="site-state-item-count">42</span>
                    <span class="site-state-item-name">标签</span>
                  </a>
                </div>
              
            </nav>
          

          

          
            <div class="links-of-author motion-element">
              
                <span class="links-of-author-item">
                  <a href="https://github.com/ht-dep" target="_blank" title="GitHub"><i class="fa fa-fw fa-github"></i>GitHub</a>
                  
                </span>
              
                <span class="links-of-author-item">
                  <a href="mailto:15662728521@163.com" target="_blank" title="E-Mail"><i class="fa fa-fw fa-envelope"></i>E-Mail</a>
                  
                </span>
              
            </div>
          

          
          

          
          

          
            
          
          

        </div>
      </section>

      
      <!--noindex-->
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc">

            
              
            

            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#事务四大特性"><span class="nav-number">1.</span> <span class="nav-text">事务四大特性</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-原子性"><span class="nav-number">1.1.</span> <span class="nav-text">1. 原子性</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-一致性"><span class="nav-number">1.2.</span> <span class="nav-text">2. 一致性</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-隔离性"><span class="nav-number">1.3.</span> <span class="nav-text">3. 隔离性</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-持久性"><span class="nav-number">1.4.</span> <span class="nav-text">4. 持久性</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#数据不一致"><span class="nav-number">2.</span> <span class="nav-text">数据不一致</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-丢失修改"><span class="nav-number">2.1.</span> <span class="nav-text">1. 丢失修改</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-读脏数据"><span class="nav-number">2.2.</span> <span class="nav-text">2. 读脏数据</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-不可重复读"><span class="nav-number">2.3.</span> <span class="nav-text">3. 不可重复读</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#隔离级别"><span class="nav-number">3.</span> <span class="nav-text">隔离级别</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#1-未提交读（READ-UNCOMMITTED）"><span class="nav-number">3.1.</span> <span class="nav-text">1. 未提交读（READ UNCOMMITTED）</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#2-提交读（READ-COMMITTED）"><span class="nav-number">3.2.</span> <span class="nav-text">2. 提交读（READ COMMITTED）</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#3-可重复读（REPEATABLE-READ）"><span class="nav-number">3.3.</span> <span class="nav-text">3. 可重复读（REPEATABLE READ）</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#4-可串行化（SERIALIXABLE）"><span class="nav-number">3.4.</span> <span class="nav-text">4. 可串行化（SERIALIXABLE）</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#可串行化调度"><span class="nav-number">4.</span> <span class="nav-text">可串行化调度</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#封锁类型"><span class="nav-number">5.</span> <span class="nav-text">封锁类型</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#封锁粒度"><span class="nav-number">6.</span> <span class="nav-text">封锁粒度</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#封锁协议"><span class="nav-number">7.</span> <span class="nav-text">封锁协议</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#三级封锁协议"><span class="nav-number">7.1.</span> <span class="nav-text">三级封锁协议</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#两段锁协议"><span class="nav-number">7.2.</span> <span class="nav-text">两段锁协议</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#乐观锁和悲观锁"><span class="nav-number">8.</span> <span class="nav-text">乐观锁和悲观锁</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#悲观锁"><span class="nav-number">8.1.</span> <span class="nav-text">悲观锁</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#乐观锁"><span class="nav-number">8.2.</span> <span class="nav-text">乐观锁</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#MySQL-隐式和显示锁定"><span class="nav-number">8.3.</span> <span class="nav-text">MySQL 隐式和显示锁定</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#范式"><span class="nav-number">9.</span> <span class="nav-text">范式</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#第一范式-1NF"><span class="nav-number">9.1.</span> <span class="nav-text">第一范式 (1NF)</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#第二范式-2NF"><span class="nav-number">9.2.</span> <span class="nav-text">第二范式 (2NF)</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#第三范式-3NF"><span class="nav-number">9.3.</span> <span class="nav-text">第三范式 (3NF)</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#BC-范式（BCNF）"><span class="nav-number">9.4.</span> <span class="nav-text">BC 范式（BCNF）</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#约束"><span class="nav-number">10.</span> <span class="nav-text">约束</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#键码"><span class="nav-number">10.1.</span> <span class="nav-text">键码</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#单值约束"><span class="nav-number">10.2.</span> <span class="nav-text">单值约束</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#引用完整性约束"><span class="nav-number">10.3.</span> <span class="nav-text">引用完整性约束</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#域约束"><span class="nav-number">10.4.</span> <span class="nav-text">域约束</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#一般约束"><span class="nav-number">10.5.</span> <span class="nav-text">一般约束</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#数据库的三层模式和两层映像"><span class="nav-number">11.</span> <span class="nav-text">数据库的三层模式和两层映像</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#外模式"><span class="nav-number">11.1.</span> <span class="nav-text">外模式</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#模式"><span class="nav-number">11.2.</span> <span class="nav-text">模式</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#内模式"><span class="nav-number">11.3.</span> <span class="nav-text">内模式</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#外模式-模式映像"><span class="nav-number">11.4.</span> <span class="nav-text">外模式/模式映像</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#模式-内模式映像"><span class="nav-number">11.5.</span> <span class="nav-text">模式/内模式映像</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#ER-图"><span class="nav-number">12.</span> <span class="nav-text">ER 图</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#实体的三种联系"><span class="nav-number">12.1.</span> <span class="nav-text">实体的三种联系</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#表示出现多次的关系"><span class="nav-number">12.2.</span> <span class="nav-text">表示出现多次的关系</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#联系的多向性"><span class="nav-number">12.3.</span> <span class="nav-text">联系的多向性</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#表示子类"><span class="nav-number">12.4.</span> <span class="nav-text">表示子类</span></a></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#一些概念"><span class="nav-number">13.</span> <span class="nav-text">一些概念</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#参考资料"><span class="nav-number">14.</span> <span class="nav-text">参考资料</span></a></li></ol></div>
            

          </div>
        </section>
      <!--/noindex-->
      

      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>
<div class="copyright">&copy; 2017 &mdash; <span itemprop="copyrightYear">2019</span>
  <span class="with-love">
    <i class="fa fa-user"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">ht-dep</span>

  

  
</div>



















        
<div class="busuanzi-count">
  <script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js"></script>

  
    <span class="site-uv" title="总访客量">
      <i class="fa fa-user"></i>
      <span class="busuanzi-value" id="busuanzi_value_site_uv"></span>
    </span>
  

  
    <span class="site-pv" title="总访问量">
      <i class="fa fa-eye"></i>
      <span class="busuanzi-value" id="busuanzi_value_site_pv"></span>
    </span>
  
</div>









        
      </div>
    </footer>

    
      <div class="back-to-top">
        <i class="fa fa-arrow-up"></i>
        
      </div>
    

    

  </div>

  

<script type="text/javascript">
  if (Object.prototype.toString.call(window.Promise) !== '[object Function]') {
    window.Promise = null;
  }
</script>


























  
  
    <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script>
  

  
  
    <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script>
  


  


  <script type="text/javascript" src="/js/src/utils.js?v=6.0.6"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=6.0.6"></script>



  
  


  <script type="text/javascript" src="/js/src/affix.js?v=6.0.6"></script>

  <script type="text/javascript" src="/js/src/schemes/pisces.js?v=6.0.6"></script>



  
  <script type="text/javascript" src="/js/src/scrollspy.js?v=6.0.6"></script>
<script type="text/javascript" src="/js/src/post-details.js?v=6.0.6"></script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=6.0.6"></script>



  



	





  





  










  





  

  

  

  

  
  

  

  

  

  


<script src="/live2dw/lib/L2Dwidget.min.js?0c58a1486de42ac6cc1c59c7d98ae887"></script><script>L2Dwidget.init({"display":{"position":"right","width":100,"height":150},"model":{"jsonPath":"/live2dw/assets/tororo.model.json"},"mobile":{"show":false,"scale":0.5},"react":{"opacityDefault":1,"opacityOnHover":0.2}});</script></body>
</html>
